package com.fks.fks_service.utils.aliutils;//package com.fks.fks_service.utils.aliutils;
//
//import com.alipay.api.AlipayApiException;
//import com.alipay.api.AlipayClient;
//import com.alipay.api.DefaultAlipayClient;
//import com.alipay.api.domain.AlipayTradeAppPayModel;
//import com.alipay.api.internal.util.AlipaySignature;
//import com.alipay.api.request.AlipayTradeAppPayRequest;
//import com.alipay.api.response.AlipayTradeAppPayResponse;
//import com.google.gson.Gson;
//import com.zrjk.zrjk_service.AliPayConfig;
//import com.zrjk.zrjk_service.base.JsonResult;
//import com.zrjk.zrjk_service.base.ResultCode;
//import com.zrjk.zrjk_service.controller.BannerController;
//import com.zrjk.zrjk_service.mapper.*;
//import com.zrjk.zrjk_service.pojo.*;
//import com.zrjk.zrjk_service.pojo.user.UserDB;
//import com.zrjk.zrjk_service.service.AlipayService;
//import com.zrjk.zrjk_service.service.CustomerService;
//import com.zrjk.zrjk_service.service.UserService;
//import com.zrjk.zrjk_service.service.VideoService;
//import com.zrjk.zrjk_service.utils.AliPayUtils;
//import com.zrjk.zrjk_service.utils.DateUtils;
//import com.zrjk.zrjk_service.utils.UserUtils;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import javax.servlet.http.HttpServletRequest;
//import java.math.BigDecimal;
//import java.net.URLEncoder;
//import java.util.*;
//
//@Service
//public class AlipayServiceImpl implements AlipayService {
//    private static final Logger log = LoggerFactory.getLogger(AlipayServiceImpl.class);
//
//    @Autowired
//    AppDBMapper appDBMapper;
//    @Autowired
//    UserDBMapper userDBMapper;
//    @Autowired
//    UserService userService;
//    @Autowired
//    VerifyDBMapper verifyDBMapper;
//    @Autowired//vip价格
//    VipDBMapper vipDBMapper;
//    @Autowired//消息
//    MassageDBMapper massageDBMapper;
//    @Autowired//vip用户
//    VipUserDBMapper vipUserDBMapper;
//    @Autowired//分佣记录
//    CommissionRecordDBMapper commissionRecordDBMapper;
//    @Autowired//淘客户
//    CustomerService customerService;
//    @Autowired
//    VideoOrderDBMapper videoOrderDBMapper;
//    @Autowired
//    AmoyCustomerOrderDBMapper amoyCustomerOrderDBMapper;
//    @Autowired
//    VideoService videoService;
//    @Autowired
//    AlipayDBMapper alipayDBMapper;
//
////    private static final String attachRegex = "AZRJKA";
//
//    @Override
//    public Map<String, Object> aliPayUnifiedOrder(HttpServletRequest requestApp) {
//        String appCode = requestApp.getHeader("zrjkAppcode");
//        if (appCode == null) {
//            log.info("appCode为null,设置默认值，"+"appCode--"+appCode);
//            appCode = "6f16e84aebea4b8aa69399177b8bf5d7";
//        } else {
//            log.info("appCode--"+appCode);
//        }
//        //检测app所属
//        CnApp cnApp = appDBMapper.selectAppByAppCode(appCode);
//        if (cnApp == null)
//            return JsonResult.error(ResultCode.app_not_exists,"app不存在");
//        //获取app支付设置
//        CnAlipay cnAlipay = alipayDBMapper.selectAlipayByAppid(cnApp.getId());
//        if (cnAlipay == null) {
//            return JsonResult.error(ResultCode.not_exists,"商家支付宝未配置");
//        }
//        //请求参数
//        String token = requestApp.getParameter("token");
//        System.out.println("生成订单--token--"+token);
//        VerifyDB verifyDB = verifyDBMapper.getVerifyDBByToken(token);
//        if (verifyDB == null) {
//            return JsonResult.error(ResultCode.token_error,"请重新登录");
//        }
//        UserDB userDB = userDBMapper.getUserById(verifyDB.getUid());
//        if (userDB == null) {
//            return JsonResult.error(ResultCode.not_exists,"用户不存在");
//        }
//        if (requestApp.getParameter("vid") == null || requestApp.getParameter("type") == null) {
//            return JsonResult.error(ResultCode.param_is_null,"缺少参数");
//        }
//        int uid = userDB.getId();
//        int vid = Integer.parseInt(requestApp.getParameter("vid"));
//        int type = Integer.parseInt(requestApp.getParameter("type"));
//        VipDB vipDB = vipDBMapper.get(vid);
//        if (vipDB == null) {
//            return JsonResult.error(ResultCode.not_exists,"不存在该会员套餐");
//        }
//        VipUserDB vipUserDB = vipUserDBMapper.getUser(uid);
//        if (vipUserDB != null && vipUserDB.getIsExpired() == 0) {
//            return JsonResult.error(ResultCode.has_buy,"您已经购买会员套餐");
//        }
//        /**
//         * 定义变量，可以根据实际需求获取并生成相应变量，变量值仅供参考
//         */
//        String body = vipDB.getTitle();
//        String outTradeNo = AliPayUtils.getOutTradeNo();
//        Double totalFee = Double.parseDouble(vipDB.getFee());
//        /**
//         * 拼接自己的业务参数
//         *  例如 用户id + 会员套餐id + 支付类型
//         *  用指定分隔符进行拼接，以便后续做业务处理
//         */
//        StringBuffer passBackParams = new StringBuffer();
//        passBackParams.append(uid);//用户id
//        passBackParams.append(AliPayConfig.attachRegex);
//        passBackParams.append(vid);//会员套餐id
//        passBackParams.append(AliPayConfig.attachRegex);
//        passBackParams.append(type);//支付类型，参考消息的type
//        passBackParams.append(AliPayConfig.attachRegex);
//        passBackParams.append(String.valueOf(cnApp.getId()));//app
//
//        /**
//         * 以下部分可以共用，复制即可
//         * *********************************************************
//         */
//        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称：alipay.trade.app.pay
//        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//        //SDK已经封装掉了公共参数，这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
//        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
//        model.setBody(body);
//        model.setSubject(body);
//        model.setOutTradeNo(outTradeNo);
//        model.setTimeoutExpress("30m");
//        model.setTotalAmount(totalFee + "");
//        model.setProductCode("QUICK_MSECURITY_PAY");
//        model.setPassbackParams(URLEncoder.encode(passBackParams.toString()));
//        request.setBizModel(model);
////        request.setNotifyUrl(AliPayConfig.ALIPAY_NOTIFY_URL);
//        request.setNotifyUrl(cnAlipay.getAlipayNotifyUrl());
//        System.out.println(">>>>支付宝统一下单接口请求参数cnAlipay：" + new Gson().toJson(cnAlipay));
//        System.out.println(">>>>支付宝统一下单接口请求参数：" + model.getBody() + "," + model.getOutTradeNo() + "," + model.getTotalAmount());
//
//        /**实例化客户端*/
////        AlipayClient alipayClient = new DefaultAlipayClient(
////                AliPayConfig.SERVERURL,
////                AliPayConfig.APPID,
////                AliPayConfig.APP_PRIVATE_KEY,
////                AliPayConfig.FORMAT,
////                AliPayConfig.CHARSET,
////                AliPayConfig.ALIPAY_PUBLIC_KEY,
////                AliPayConfig.SIGN_TYPE);
//        AlipayClient alipayClient = new DefaultAlipayClient(
//                cnAlipay.getAlipayServerUrl(),
//                cnAlipay.getAlipayAppid(),
//                cnAlipay.getAlipayPrivateKey(),
//                cnAlipay.getAlipayFormat(),
//                cnAlipay.getAlipayCharset(),
//                cnAlipay.getAlipayPublicKey(),
//                cnAlipay.getAlipaySignType());
//        try {
//            //这里和普通的接口调用不同，使用的是sdkExecute
//            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
//            String orderString = response.getBody();
//            //就是orderString 可以直接给客户端请求，无需再做处理。
//            System.out.println(">>>生成调用支付宝参数" + orderString);
//            /**************************************************************/
//            return JsonResult.success("生成订单成功").data(orderString);
//        } catch (AlipayApiException e) {
//            System.out.println(e.getMessage());
//            return JsonResult.error(ResultCode.handle_fail,"生成订单失败");
//        }
//    }
//
//    @Override
//    public Map<String, Object> aliPayUnifiedOrder2(CnAlipay cnAlipay, String body,String outTradeNo,Double totalFee,String passBackParams) {
//        Map<String,Object> map = new HashMap<>();
//        /**
//         * 以下部分可以共用，复制即可
//         * *********************************************************
//         */
//        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称：alipay.trade.app.pay
//        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//        //SDK已经封装掉了公共参数，这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
//        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
//        model.setBody(body);
//        model.setSubject(body);
//        model.setOutTradeNo(outTradeNo);
//        model.setTimeoutExpress("30m");
//        model.setTotalAmount(totalFee + "");
//        model.setProductCode("QUICK_MSECURITY_PAY");
//        model.setPassbackParams(URLEncoder.encode(passBackParams));
//        request.setBizModel(model);
////        request.setNotifyUrl(AliPayConfig.ALIPAY_NOTIFY_URL);
//        request.setNotifyUrl(cnAlipay.getAlipayNotifyUrl());
//        System.out.println(">>>>支付宝统一下单接口请求参数cnAlipay：" + new Gson().toJson(cnAlipay));
//        System.out.println(">>>>支付宝统一下单接口请求参数：" + model.getBody() + "," + model.getOutTradeNo() + "," + model.getTotalAmount());
//
//        /**实例化客户端*/
////        AlipayClient alipayClient = new DefaultAlipayClient(
////                AliPayConfig.SERVERURL,
////                AliPayConfig.APPID,
////                AliPayConfig.APP_PRIVATE_KEY,
////                AliPayConfig.FORMAT,
////                AliPayConfig.CHARSET,
////                AliPayConfig.ALIPAY_PUBLIC_KEY,
////                AliPayConfig.SIGN_TYPE);
//        AlipayClient alipayClient = new DefaultAlipayClient(
//                cnAlipay.getAlipayServerUrl(),
//                cnAlipay.getAlipayAppid(),
//                cnAlipay.getAlipayPrivateKey(),
//                cnAlipay.getAlipayFormat(),
//                cnAlipay.getAlipayCharset(),
//                cnAlipay.getAlipayPublicKey(),
//                cnAlipay.getAlipaySignType());
//        try {
//            //这里和普通的接口调用不同，使用的是sdkExecute
//            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
//            String orderString = response.getBody();
//            //就是orderString 可以直接给客户端请求，无需再做处理。
//            System.out.println(">>>生成调用支付宝参数" + orderString);
//            /**************************************************************/
//            map.put("code",200);
//            map.put("data",orderString);
//            map.put("msg","生成订单成功");
//            return map;
//        } catch (AlipayApiException e) {
//            System.out.println(e.getMessage());
//            map.put("code",-1);
//            map.put("msg","生成订单失败");
//            return map;
//        }
//    }
//
//
//    @Override
//    public Map<String, Object> aliPayNotify(Map requestParams) {
//        Map<String,Object> map = new HashMap<>();
//        System.out.println(">>>支付宝回调参数：" + requestParams);
//        Map<String,String> params = new HashMap<>();
//        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
//            String name = (String) iter.next();
//            String[] values = (String[]) requestParams.get(name);
//            String valueStr = "";
//            for (int i = 0; i < values.length; i++) {
//                valueStr = (i == values.length - 1) ? valueStr + values[i]
//                        : valueStr + values[i] + ",";
//            }
//            //乱码解决，这段代码在出现乱码时使用。
//            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
//            params.put(name, valueStr);
//        }
//        System.out.println(">>>支付宝回调参数解析：" + params);
//        String tempPassback = params.get("passback_params");
//        String[] tempNeedParamArr = tempPassback.split(AliPayConfig.attachRegex);
//        int appid = Integer.parseInt(tempNeedParamArr[3]);
//        //获取app支付设置
//        CnAlipay cnAlipay = alipayDBMapper.selectAlipayByAppid(appid);
//        if (cnAlipay == null) {
//            return JsonResult.error(ResultCode.not_exists,"商家支付宝未配置");
//        }
//        System.out.println(">>>>支付宝回调参数解析cnAlipay：" + new Gson().toJson(cnAlipay));
//        try {
//            //切记alipaypublickey是支付宝的公钥，请去open.alipay.com对应应用下查看。
////            boolean flag = AlipaySignature.rsaCheckV1(
////                    params,
////                    AliPayConfig.ALIPAY_PUBLIC_KEY,
////                    AliPayConfig.CHARSET, AliPayConfig.SIGN_TYPE);
//            boolean flag = AlipaySignature.rsaCheckV1(
//                    params,
//                    cnAlipay.getAlipayPublicKey(),
//                    cnAlipay.getAlipayCharset(), cnAlipay.getAlipaySignType());
//            if(flag) {
//                System.out.println(">>>支付宝回调签名认证成功");
//                //商户订单号
//                String out_trade_no = params.get("out_trade_no");
//                //交易状态
//                String trade_status = params.get("trade_status");
//                //交易金额
//                String amount = params.get("total_amount");
//                //商户app_id
//                String app_id = params.get("app_id");
//
//                if ("TRADE_SUCCESS".equals(trade_status) || "TRADE_FINISHED".equals(trade_status)) {
//                    /**
//                     * 自己的业务处理
//                     */
//                    String newTime = DateUtils.getNowTime();
//                    String passback = params.get("passback_params");
//                    String[] needParamArr = passback.split(AliPayConfig.attachRegex);
//                    int type = Integer.parseInt(needParamArr[2]);
//                    if (type == 4) {////支付类型(消息类型)  0、邀请注册 1、申请贷款产品 2、申请信用卡 3、购买vip 4、淘客户 5、视频教程
//                        int acid = Integer.parseInt(needParamArr[1]);
//                        //购买的客户信息
//                        AmoyCustomerDB amoyCustomerDB = customerService.getAmoyCustomer(acid);
//                        //支付的用户
//                        VerifyDB verifyDB = verifyDBMapper.getVerifyDBByToken(needParamArr[0]);
//                        UserDB userDB = userDBMapper.getUserById(verifyDB.getUid());
//                        //判断是否购买客户记录
//                        if (amoyCustomerOrderDBMapper.hasBuy(userDB.getId(),acid) > 0) {
//                            map.put("code",200);
//                            map.put("msg","支付宝回调成功");
//                            return map;
//                        }
//                        //购买客户记录
//                        AmoyCustomerOrderDB amoyCustomerOrderDB = new AmoyCustomerOrderDB();
//                        amoyCustomerOrderDB.setCreateTime(newTime);
//                        amoyCustomerOrderDB.setUid(userDB.getId());
//                        amoyCustomerOrderDB.setAcid(acid);
//                        amoyCustomerOrderDB.setPayType(2);
//                        amoyCustomerOrderDB.setPayValue(amount);
//                        amoyCustomerOrderDB.setOrderNo(out_trade_no);
//                        StringBuffer markBuffer = new StringBuffer();
//                        markBuffer.append("id=");
//                        markBuffer.append(userDB.getId());
//                        markBuffer.append(",手机号=");
//                        markBuffer.append(userDB.getPhone());
//                        markBuffer.append(",名称=");
//                        markBuffer.append(userDB.getNickname());
//                        markBuffer.append("的账号购买了客户，客户姓名=");
//                        markBuffer.append(amoyCustomerDB.getName());
//                        markBuffer.append(",手机号=");
//                        markBuffer.append(userDB.getId());
//                        markBuffer.append(",id=");
//                        markBuffer.append(amoyCustomerDB.getId());
//                        amoyCustomerOrderDB.setMark(markBuffer.toString());
//                        customerService.addAmoyCustomerOrder(amoyCustomerOrderDB);
//                        //结算佣金消息
//                        userService.settlementCommission(userDB,amount,type);
//                    } else if (type == 5) {
//                        int vid = Integer.parseInt(needParamArr[1]);
//                        //购买的客户信息
//                        VideoDB videoDB = videoService.getVideoById(vid);
//                        //支付的用户
//                        VerifyDB verifyDB = verifyDBMapper.getVerifyDBByToken(needParamArr[0]);
//                        UserDB userDB = userDBMapper.getUserById(verifyDB.getUid());
//                        //判断是否购买客户记录
//                        if (videoOrderDBMapper.hasBuy(userDB.getId(),vid) > 0) {
//                            map.put("code",200);
//                            map.put("msg","支付宝回调成功");
//                            return map;
//                        }
//                        //购买客户记录
//                        VideoOrderDB videoOrderDB = new VideoOrderDB();
//                        videoOrderDB.setCreateTime(newTime);
//                        videoOrderDB.setUid(userDB.getId());
//                        videoOrderDB.setVid(vid);
//                        videoOrderDB.setPayType(2);
//                        videoOrderDB.setPayValue(amount);
//                        videoOrderDB.setOrderNo(out_trade_no);
//                        StringBuffer markBuffer = new StringBuffer();
//                        markBuffer.append("id=");
//                        markBuffer.append(userDB.getId());
//                        markBuffer.append(",手机号=");
//                        markBuffer.append(userDB.getPhone());
//                        markBuffer.append(",名称=");
//                        markBuffer.append(userDB.getNickname());
//                        markBuffer.append("的账号购买了课程，课程名=");
//                        markBuffer.append(videoDB.getTitle());
//                        markBuffer.append(",手机号=");
//                        markBuffer.append(userDB.getId());
//                        markBuffer.append(",id=");
//                        markBuffer.append(videoDB.getId());
//                        videoOrderDB.setMark(markBuffer.toString());
//                        videoService.addVideoOrder(videoOrderDB);
//                        //结算佣金消息
//                        userService.settlementCommission(userDB,amount,type);
//                    } else {
//                        for (String key : params.keySet()) {
//                            System.out.println(key+"--"+params.get(key));
//                        }
//                        int uid = Integer.parseInt(needParamArr[0]);
//                        UserDB userDB = userDBMapper.getUserById(uid);
//                        int vid = Integer.parseInt(needParamArr[1]);
//                        VipDB vipDB = vipDBMapper.get(vid);
//                        //判断是否添加会员
//                        if (vipUserDBMapper.isVip(uid) != null) {
//                            map.put("code",200);
//                            map.put("msg","支付宝回调成功");
//                            return map;
//                        }
//                        //添加vip会员
//                        VipUserDB vipUserDB = new VipUserDB();
//                        vipUserDB.setCreateTime(newTime);
//                        long day = (long) vipDB.getMonth() * 30;
//                        vipUserDB.setDeadline(DateUtils.addDay(new Date(),day));
//                        vipUserDB.setIsExpired(0);
//                        vipUserDB.setUid(uid);
//                        vipUserDB.setVid(vid);
//                        vipUserDBMapper.insert(vipUserDB);
//                        //结算佣金消息
//                        userService.settlementCommission(userDB,amount,type);
//                    }
//                    System.out.println("处理支付宝回调业务，支付宝交易状态："+trade_status);
//                } else {
//                    System.out.println("没有处理支付宝回调业务，支付宝交易状态："+trade_status+",params:"+params);
//                }
//            } else {
//                System.out.println("支付宝回调签名认证失败，signVerified=false, params:"+params);
//                map.put("code",-1);
//                map.put("msg","支付宝回调签名认证失败");
//                return map;
//            }
//        } catch (Exception e){
////            e.printStackTrace();
//            System.out.println(e.getMessage());
//            System.out.println("Exception, params:"+params);
//            map.put("code",-1);
//            map.put("msg","支付宝回调签名认证失败");
//            return map;
//        }
//        map.put("code",200);
//        map.put("msg","支付宝回调成功");
//        return map;
//    }
//}
